#pragma once
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <cstring>
#include <string>
#include <errno.h>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include "InetAddress.h"
#include<iostream>
// 创建一个非阻塞的socket。
int createnonblocking();
class Sock
{
    static const int gbacklog = 128;
    static const int defaultValue = -1;

public:
    Sock(int sock);
    ~Sock();
    int getSock() const;
    std::string getIp() const;
    uint16_t getPort()const ;
    void setReuseAddr(bool flag);  // 设置SO_REUSEADDR选项，true-打开，false-关闭。
    void settcpnodelay(bool flag); // 设置SO_REUSEPORT选项。
    void setReusePort(bool flag);  // 设置TCP_NODELAY选项。
    void setKeepAlive(bool flag);  // 设置SO_KEEPALIVE选项。
    void bind(const InetAddress &servaddr);
    // 第二个参数是办半连接的队列
    void listen(int backlog = gbacklog);
    void setIPPort(const std::string& ip ,uint16_t port);   //设置ip和端口
    int Accept(InetAddress &servaddr);
    int acceptNonBlocking(InetAddress &servaddr);

private:
    const int sock_;
    std::string ip_;
    uint16_t port_;
};